package com.atguigu.gmall.all.contoller;

import com.atguigu.gmall.common.result.Result;
import com.atguigu.gmall.model.product.BaseCategoryView;
import com.atguigu.gmall.product.client.ProductFeignClient;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import org.thymeleaf.TemplateEngine;
import org.thymeleaf.context.Context;

import java.io.File;
import java.io.PrintWriter;
import java.io.Writer;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;

/**
 * @author: 李旭
 * @create: 2021-07-12 15:39
 * 查询首页
 **/
@Controller
public class IndexController {

    @Autowired
    private ProductFeignClient productFeignClient;

    //进入首页  www.gmall.com  item.gmall.com/1.html
    @GetMapping("/")
    public String index(Model model) {
        List<Map> listMap = getData();
        model.addAttribute("list", listMap);
        return "index/index";
    }

    //获取数据
    public List<Map> getData(){
        //集合 长度：1099长度
        List<BaseCategoryView> baseCagegoryViewList =
                productFeignClient.getBaseCagegoryViewList();
        //对一级分类的ID进行分组查询
        // Long : 1    List<BaseCategoryView> ; 60
        // Long : 2    List<BaseCategoryView> ; 25
        Map<Long, List<BaseCategoryView>> baseCagegoryViewMap = baseCagegoryViewList.stream().
                collect(Collectors.groupingBy(BaseCategoryView::getCategory1Id));


        //无敌版对象
        List<Map> listMap = new ArrayList<>();
        //Map0  1:index 2:一级分类id  3:一级分类名称  4：二级分类集合
        //Map1  1:index 2:一级分类id  3:一级分类名称  4：二级分类集合
        //Map2  1:index 2:一级分类id  3:一级分类名称  4：二级分类集合
        //Map3  1:index 2:一级分类id  3:一级分类名称  4：二级分类集合
        //Map4  1:index 2:一级分类id  3:一级分类名称  4：二级分类集合
        //.....
        //Map16  1:index 2:一级分类id  3:一级分类名称  4：二级分类集合

        //作业 ：
        int index = 1;
        for (Map.Entry<Long, List<BaseCategoryView>> category1IdEntry : baseCagegoryViewMap.entrySet()) {
            List<BaseCategoryView> category2IdList = category1IdEntry.getValue();
            Map category1IdMap = new HashMap();
            category1IdMap.put("index", index++);
            category1IdMap.put("categoryId", category1IdEntry.getKey());
            category1IdMap.put("categoryName", category2IdList.get(0).getCategory1Name());

            ////////////////////二//////////////////////////////////////////////////////
            List<Map> category2ListMap = new ArrayList<>();
            //Long:
            Map<Long, List<BaseCategoryView>> category2Map = category2IdList.stream().
                    collect(Collectors.groupingBy(BaseCategoryView::getCategory2Id));
            for (Map.Entry<Long, List<BaseCategoryView>> category2Entry : category2Map.entrySet()) {
                Map category2IdMap = new HashMap();
                List<BaseCategoryView> category3List = category2Entry.getValue();
                category2IdMap.put("categoryId", category2Entry.getKey());
                category2IdMap.put("categoryName", category3List.get(0).getCategory2Name());
                /////////////////////三///////////////////////////////////////////
                List<Map> category3ListMap = category3List.stream()//偷天换日
                        .map(baseCategoryView -> {
                            Map map = new HashMap();
                            map.put("categoryId", baseCategoryView.getCategory3Id());
                            map.put("categoryName", baseCategoryView.getCategory3Name());
                            return map;
                        }).collect(Collectors.toList());
                category2IdMap.put("categoryChild", category3ListMap);
                category2ListMap.add(category2IdMap);
            }
            category1IdMap.put("categoryChild", category2ListMap);
            listMap.add(category1IdMap);
        }
        return listMap;
    }


    @Autowired
    private TemplateEngine templateEngine;

    //静态化程序  本次是由Http访问来触发   实际中应使用定时器 来触发此程序
    @GetMapping("/createHtml")
    @ResponseBody
    public Result createhtml() {
        //公式 ;   模板  + 数据  == 输出
        //模板 : Thymeleaf 总把页面叫做模板   index.html( th:each th:text
        //数据 ： 来源于DB  更新比较好 Redis数据延迟  不要速度
        //== ： 静态化技术 Thymeleaf   1。引入坐标 2.配置文件  3：注入TemplateEngine
        //输出 ： 输出流  将结果输出到指定的文件夹中  D:\temp
        List<Map> listMap = getData();
        Context context  = new Context();
        context.setVariable("list",listMap);
        Writer writer = null;
        try {
            //写  UTF-8
        /*    writer = new OutputStreamWriter(
                    new FileOutputStream("D:\\temp\\index.html"),"UTF-8");*/
            writer =  new PrintWriter(new File("D:\\temp\\index.html"),"UTF-8");
            //参数1：模板
            //参数2：数据
            //参数3：输出
            templateEngine.process("index/index",context,writer);//读 UTF-8
        } catch (Exception e) {
            e.printStackTrace();
        }
        return Result.ok();

    }
}
